package com.googlecode.astoolkit.modules.content.section {
	
	import com.googlecode.astoolkit.modules.content.model.ContentModel;
	import com.googlecode.astoolkit.utils.AbstractNode;
	import com.googlecode.astoolkit.utils.INode;
	import com.googlecode.astoolkit.utils.Sitemap;
	
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.utils.getDefinitionByName;
  	
	public class AbstractSection extends Sprite implements ISection{
		
		private var _id:uint;
		
		private var _nextSection:ISection;
		private var _previousSection:ISection;
		private var _inited:Boolean;
		private var _model:ContentModel;
		
		public function AbstractSection(){
			//
		}
		
		//
		public function init(id:uint):void{
			//trace("id-->" + id);
			_id = id;
			_model = ContentModel.getInstance();
			AbstractNode(Sitemap.getNodeById(_id)).instance = this;
			_nextSection = new NullSection();
			_previousSection = new NullSection();
			this.addEventListener(Event.ADDED_TO_STAGE, addedToStage);
		}
		
		// 
		private function addedToStage(e:Event):void{
			this.removeEventListener(Event.ADDED_TO_STAGE, addedToStage);
			// creamos dinámicamente las instancias de subseccion
			var node:INode = Sitemap.getNodeById(_id);
			for each(var n:AbstractNode in node.children){
				var nombre:String = n.className;
				//trace("nombre-->" + n.path);
				var clase:Class = Class(getDefinitionByName(nombre));
				var clild:AbstractSection = new clase();
				clild.init(n.id);
				super.addChild(clild);
			}  
			
		}
		
		// implementacion básica de la entrada de la página
		// por si no se implementa en la clase concreta 
		public function transitionIn():void{
			transitionInComplete();
		}
		
		// implementacion básica de la salida de la página
		// por si no se implementa en la clase concreta 
		public function transitionOut():void{
			transitionOutComplete();
		}
		
		// entrada real de la página tras la transición de entrada
		protected function transitionInComplete():void{
			_nextSection.abstractTransitionIn();
		}
		
		// salida real de la página tras la transición de salida
		protected function transitionOutComplete():void{
			//this.parent.removeChild(this);
			_previousSection = new NullSection();
			_nextSection.transitionOut();
			_nextSection = new NullSection();
			_inited = false;
		}
		
		public function abstractTransitionIn():void{
			_nextSection = AbstractNode(_model.pathIds.next()).instance;
			//trace("_nextSection-->" + _nextSection);
			// cerramos la previa, si la siguiente es otra diferente
			if(_previousSection != _nextSection){
				_previousSection.transitionOut();
			}
			
			// guardamos en previa la que hay
			_previousSection = _nextSection;

			// Si la sección no está iniciada la inicio
			// y si lo está llamo directamente a transitionInComplete
			if(_inited == false){
				_inited = true;
				//parent.addChild(this);
				transitionIn();
			}else{
				transitionInComplete();
			} 
			
		}
		
		 
	}
}